package c10异常;

/**
 * 多catch块串联与多tryCatchFinally嵌套测试
 *
 * @author 炜sama
 * 1、catch可以串联成一组。小的异常应该排在前面，以免被大的异常覆盖而无法捕获对应的异常，否则无法通过编译！
 * 2、一组catch一次只能捕获一个异常。
 * 3、catch内抛出的异常将会抛到当前try/catch块的外面，而不是给紧跟这个catch块后面的其他catch块，
 * 更不是从这组catch块的第一个块开始匹配！
 * 4、try/catch可以嵌套，且每层的try内抛出的异常先匹配当前层的catch块，如果没有匹配的再匹配外层的，以此类推。
 */
public class 多catch块串联与多tryCatchFinally嵌套 {

	public static void main(String[] args) {
		try {
			try {
				String s = null;
				s.length();
//				throw new Exception("内层try抛出的异常");
			} catch (NullPointerException e) {
				System.err.println(e.getMessage());

				//这里引发的异常不会再被此层的catch捕获了，也就是说不会被下面的catch捕获到！
				//这个异常被抛到了当前的try/catch块外，如果外层没有捕获而且方法也没有throws，则会使程序挂掉！
				int i = 1 / 0;
//				String s=null;s.length();//同上！
			} catch (ArithmeticException e) {
				System.err.println(e.getMessage());
//				throw new RuntimeException("catch (ArithmeticException e)抛出的异常：");
			} catch (RuntimeException e) {
				System.err.println(e.getMessage());
			} finally {
				System.err.println("内层finally");
			}
		} catch (Exception e) {
			System.err.println("外层try/catch--" + e.getMessage());
		} finally {
			System.err.println("外层finally");
		}
	}

}
